package Iterator_pattern.ex2;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 申书航
 * @version 1.0
 * 学生分页迭代器类，用于管理学生数据的分页访问。
 */
public class StudentPageIterator implements PageIterator<Student> {

    private final StudentRepo studentRepo;  // 学生仓库

    private int pageSize = 5;   // 每页显示的学生数量

    private int pageIndex = 1;  // 当前页码

    /**
     * 构造函数，初始化学生仓库。
     * @param studentRepo 学生仓库
     */
    public StudentPageIterator(StudentRepo studentRepo) {
        this.studentRepo = studentRepo;
    }

    /**
     * 查找并返回当前页的数据。
     * @return 当前页的学生列表
     */
    public List<Student> findData() {
        int start = (pageIndex - 1) * pageSize; // 计算当前页的开始位置
        List<Student> temp = new ArrayList<Student>();
        int dataEnd = studentRepo.getStudents().size(); // 数据的结束位置
        int end = Math.min(start + pageSize, dataEnd);  // 计算当前页的结束位置
        for (int i = start; i < end; i++) {
            temp.add(studentRepo.getStudents().get(i));
        }
        return temp;
    }

    @Override
    /**
     * 返回上一页的数据。
     * @return 上一页的学生列表
     */
    public List<Student> previous() {
        int currPi = pageIndex - 1;
        pageIndex = Math.max(currPi, 1);    // 最小页码为1
        return findData();
    }

    @Override
    /**
     * 返回当前页的数据。
     * @return 当前页的学生列表
     */
    public List<Student> curr() {
        return findData();    // 直接返回当前页的数据
    }

    @Override
    /**
     * 返回下一页的数据。
     * @return 下一页的学生列表
     */
    public List<Student> next() {
        int currPi = pageIndex + 1;
        pageIndex = Math.min(pages(), currPi);  // 最大页码为总页数
        return findData();
    }

    @Override
    /**
     * 返回第一页的数据。
     * @return 第一页的学生列表
     */
    public List<Student> goFirst() {
        pageIndex = 1;
        return findData();
    }

    @Override
    /**
     * 跳转到指定页的数据。
     * @param pi 指定页码
     * @return 指定页的学生列表
     */
    public List<Student> goPage(int pi) {
        pi = Math.max(1, pi);    // 最小页码为1
        pi = Math.min(pageSize, pi);    // 最大页码为pageSize
        pageIndex = pi;
        return findData();
    }

    @Override
    /**
     * 返回最后一页的数据。
     * @return 最后一页的学生列表
     */
    public List<Student> goLast() {
        pageIndex = pages();
        return findData();
    }

    @Override
    /**
     * 计算总页数。
     * @return 总页数
     */
    public int pages() {
        int total = studentRepo.getStudents().size();
        int page = total / pageSize;
        if (total % pageSize != 0) {    //多出的数据不足一页
            return page + 1;
        }
        return page;
    }

    @Override
    /**
     * 设置每页显示的学生数量。
     * @param size 每页大小
     */
    public void setPageSize(int size) {
        this.pageSize = size;
    }
}
